package ar.com.larreta.colegio.client.alumnos;

import java.util.ArrayList;

import ar.com.larreta.colegio.client.CamposColegioConst;
import ar.com.larreta.colegio.intercambio.client.Alumno;
import ar.com.larreta.colegio.intercambio.client.AlumnoActualizado;
import ar.com.larreta.colegio.intercambio.client.BajasDeAlumnos;
import ar.com.larreta.colegio.intercambio.client.ListaDeAlumnos;
import ar.com.larreta.colegio.intercambio.client.ListaDeAnios;
import ar.com.larreta.colegio.intercambio.client.ListaDeDivisiones;
import ar.com.larreta.colegio.intercambio.client.ListaDeNiveles;
import ar.com.larreta.controlador.client.Invocador;
import ar.com.larreta.grilla.client.Grilla;
import ar.com.larreta.grilla.client.NumberCellRenderer;
import ar.com.larreta.grilla.client.ventanas.BotonBorrarConPedidoPresionado;
import ar.com.larreta.grilla.client.ventanas.RetornoDeLlamadaEnVentanaConGrilla;
import ar.com.larreta.grilla.client.ventanas.VentanaConGrilla;
import ar.com.larreta.intercambio.client.comunes.Dato;
import ar.com.larreta.intercambio.client.comunes.ListaDeTiposDeDocumentos;
import ar.com.larreta.vista.client.BarraHerramientas;
import ar.com.larreta.vista.client.CajaDeTexto;
import ar.com.larreta.vista.client.CamposConst;
import ar.com.larreta.vista.client.Estado;
import ar.com.larreta.vista.client.ListaDesplegable;
import ar.com.larreta.vista.client.Mensajes;

import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
import com.extjs.gxt.ui.client.widget.HorizontalPanel;
import com.extjs.gxt.ui.client.widget.VerticalPanel;
import com.extjs.gxt.ui.client.widget.form.FieldSet;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.extjs.gxt.ui.client.widget.grid.filters.StringFilter;

public class VentanaAlumnos extends VentanaConGrilla {
	
	public static final Integer ANCHO_VENTANA = 1300;
	public static final Integer LARGO_VENTANA = 605;
	
	public static final Integer ANCHO_IZQUIERDA = 575;
	public static final Integer ANCHO_CENTRO = 305;
	public static final Integer ANCHO_DERECHA = 420;
	
	public static final Integer LARGO_DATOS = 320;
	
	public static final Integer LARGO_GRILLA = 198; 
	public static final Integer TAMANIO_TEXTO_MENSAJE = 150;
	
	public static final Integer TAMANIO_CAMPOS_CURSO = 90;
	public static final Integer TAMANIO_LABEL_CURSO = 60;
	
	private static final String LISTA = "listaAlumnos";

	//Informacion del Responsable
	private CajaDeTexto nombre;
	private CajaDeTexto apellido;
	private ListaDesplegable tipoDocumento;
	private CajaDeTexto numeroDocumento;
	private ListaDesplegable nivel;
	private ListaDesplegable anio;
	private ListaDesplegable division;

	private SectorPlanesDePago planesDePagoOrigen;
	private SectorPlanesDePago planesDePagoDestino;
	
	private SectorObligaciones sectorObligaciones;
	
	private SectorPagos sectorPagos;
	
	public SectorPagos getSectorPagos() {
		return sectorPagos;
	}

	public SectorObligaciones getSectorObligaciones() {
		return sectorObligaciones;
	}

	public SectorPlanesDePago getPlanesDePagoDestino() {
		return planesDePagoDestino;
	}

	public VentanaAlumnos() {
		
		super(Mensajes.getInstancia().get("msg.colegio.alumnos.titulo"), null);
		
		this.setSize(ANCHO_VENTANA, LARGO_VENTANA);
		
		VerticalPanel barraYCampos = new VerticalPanel();
		add(barraYCampos);
		barraYCampos.setSize(ANCHO_VENTANA, LARGO_DATOS + 30);
		
		barraHerramientas = new BarraHerramientas(this, ANCHO_VENTANA, 25);
		barraYCampos.add(barraHerramientas);
		
		HorizontalPanel panelCamposEntrada = new HorizontalPanel();
		panelCamposEntrada.setSize(ANCHO_VENTANA, LARGO_DATOS);
		panelCamposEntrada.setHorizontalAlign(HorizontalAlignment.LEFT);
		barraYCampos.add(panelCamposEntrada);
		
		VerticalPanel izquierda = new VerticalPanel();
		VerticalPanel centro = new VerticalPanel();
		VerticalPanel derecha = new VerticalPanel();
		panelCamposEntrada.add(izquierda);
		panelCamposEntrada.add(centro);
		panelCamposEntrada.add(derecha);
		
		izquierda.setSize(ANCHO_IZQUIERDA, LARGO_DATOS);
		centro.setSize(ANCHO_CENTRO, LARGO_DATOS);
		derecha.setSize(ANCHO_DERECHA, LARGO_DATOS + 100);
		
		FieldSet fieldSet = new FieldSet();
		HorizontalPanel fieldSetPanel = new HorizontalPanel();
		VerticalPanel fieldSetIzquierda = new VerticalPanel();
		VerticalPanel fieldSetDerecha = new VerticalPanel();
		HorizontalPanel divisionPanel = new HorizontalPanel();
		HorizontalPanel planesPanel = new HorizontalPanel();
		VerticalPanel planesPanelIzquierda = new VerticalPanel();
		VerticalPanel planesPanelDerecha = new VerticalPanel();
		
		fieldSetPanel.add(fieldSetIzquierda);
		fieldSetPanel.add(fieldSetDerecha);
		fieldSet.add(fieldSetPanel);

		FieldSet fieldSetCurso = new FieldSet();
		fieldSetCurso.add(divisionPanel);
		fieldSet.add(fieldSetCurso);
		
		fieldSet.add(planesPanel);
		
		fieldSet.setHeading(Mensajes.getInstancia().get("msg.colegio.alumnos.detalle"));
		fieldSet.setSize((ANCHO_IZQUIERDA) - 15 , LARGO_DATOS);
		izquierda.add(fieldSet);
		
		agregarCamposInfoBasica(fieldSetIzquierda, fieldSetDerecha);
		agregarCamposDeCurso(divisionPanel, fieldSetCurso);
		agregarListasDePlanes(planesPanel, planesPanelIzquierda, planesPanelDerecha);
		
		sectorObligaciones = new SectorObligaciones();
		centro.add(sectorObligaciones);

		sectorPagos = new SectorPagos();
		derecha.add(sectorPagos);
		
		grilla = new Grilla(new ListaDeAlumnos(), getConfiguracionColumnas(), LISTA);
		grilla.setSize(ANCHO_VENTANA - 15, LARGO_GRILLA);
		grilla.setTamanioPagina(8);
		
		grilla.addSelectionChangeListener(new CambioEnLaSeleccionGrillaAlumnos(this));
		grilla.habilitarMenuContextual(new BotonBorrarConPedidoPresionado(this, new BajasDeAlumnos()));
		
		grilla.agregarFiltro(new StringFilter(CamposConst.NOMBRE));
		grilla.agregarFiltro(new StringFilter(CamposConst.APELLIDO));
		grilla.agregarFiltro(new StringFilter(CamposConst.TIPO_DOCUMENTO));
		grilla.agregarFiltro(new StringFilter(CamposConst.NUMERO_DOCUMENTO));
		grilla.agregarFiltro(new StringFilter(CamposColegioConst.NIVEL));
		grilla.agregarFiltro(new StringFilter(CamposColegioConst.ANIO));
		grilla.agregarFiltro(new StringFilter(CamposColegioConst.DIVISION));
		
		add(grilla);
		add(grilla.getToolBar());
		
		show();
	}


	private void agregarCamposInfoBasica(VerticalPanel fieldSetIzquierda,
			VerticalPanel fieldSetDerecha) {
		nombre = new CajaDeTexto(Mensajes.getInstancia().get("msg.colegio.nombre"), null);
		nombre.getCampoTexto().setWidth(TAMANIO_TEXTO_MENSAJE);
		nombre.getCampoTexto().setAllowBlank(Boolean.FALSE);
		registrarCampo(nombre.getCampoTexto());
		fieldSetIzquierda.add(nombre.getHorizontal());

		apellido = new CajaDeTexto(Mensajes.getInstancia().get("msg.colegio.apellido"), null);
		apellido.getCampoTexto().setWidth(TAMANIO_TEXTO_MENSAJE);
		apellido.getCampoTexto().setAllowBlank(Boolean.FALSE);
		registrarCampo(apellido.getCampoTexto());
		fieldSetDerecha.add(apellido.getHorizontal());

		tipoDocumento = new ListaDesplegable(Mensajes.getInstancia().get("msg.colegio.tipodocumento"), null, new ListaDeTiposDeDocumentos(), "listaTipoDocumentos");
		tipoDocumento.getCampoDesplegable().setWidth(TAMANIO_TEXTO_MENSAJE);
		tipoDocumento.getCampoDesplegable().setAllowBlank(Boolean.FALSE);
		registrarCampo(tipoDocumento.getCampoDesplegable());
		fieldSetIzquierda.add(tipoDocumento.getHorizontal());

		numeroDocumento = new CajaDeTexto(Mensajes.getInstancia().get("msg.colegio.numerodocumento"), null);
		numeroDocumento.getCampoTexto().setWidth(TAMANIO_TEXTO_MENSAJE);
		numeroDocumento.getCampoTexto().setAllowBlank(Boolean.FALSE);
		registrarCampo(numeroDocumento.getCampoTexto());
		fieldSetDerecha.add(numeroDocumento.getHorizontal());
	}


	private void agregarListasDePlanes(HorizontalPanel planesPanel,
			VerticalPanel planesPanelIzquierda, VerticalPanel planesPanelDerecha) {
		planesPanel.add(planesPanelIzquierda);
		planesPanel.add(planesPanelDerecha);
		
		planesDePagoOrigen = new SectorPlanesDePago(Mensajes.getInstancia().get("msg.colegio.planesdepagoorigen"), Boolean.TRUE);
		planesPanelIzquierda.add(planesDePagoOrigen);

		planesDePagoDestino = new SectorPlanesDePago(Mensajes.getInstancia().get("msg.colegio.planesdepagodestino"), Boolean.FALSE);
		planesPanelDerecha.add(planesDePagoDestino);
	}


	private void agregarCamposDeCurso(HorizontalPanel divisionPanel,
			FieldSet fieldSetCurso) {
		fieldSetCurso.setHeading(Mensajes.getInstancia().get("msg.colegio.alumnos.curso"));
		divisionPanel.setHorizontalAlign(HorizontalAlignment.CENTER);
		
		nivel = new ListaDesplegable(Mensajes.getInstancia().get("msg.colegio.nivel"), null, new ListaDeNiveles(), "listaNiveles", TAMANIO_LABEL_CURSO, TAMANIO_CAMPOS_CURSO);
		nivel.getCampoDesplegable().setAllowBlank(Boolean.FALSE);
		registrarCampo(nivel.getCampoDesplegable());
		divisionPanel.add(nivel.getHorizontal());

		anio = new ListaDesplegable(Mensajes.getInstancia().get("msg.colegio.anio"), null, new ListaDeAnios(), "listaAnios", TAMANIO_LABEL_CURSO, TAMANIO_CAMPOS_CURSO);
		anio.getCampoDesplegable().setAllowBlank(Boolean.FALSE);
		registrarCampo(anio.getCampoDesplegable());
		divisionPanel.add(anio.getHorizontal());

		division = new ListaDesplegable(Mensajes.getInstancia().get("msg.colegio.division"), null, new ListaDeDivisiones(), "listaDivisiones", TAMANIO_LABEL_CURSO, TAMANIO_CAMPOS_CURSO);
		division.getCampoDesplegable().setAllowBlank(Boolean.FALSE);
		registrarCampo(division.getCampoDesplegable());
		divisionPanel.add(division.getHorizontal());
	}
	
	
	public void confirmando(){
		if (esValido()) {
			Alumno alumno = null;
			if (estado.equals(Estado.CREACION)){
				alumno = new Alumno();
			} else {
				alumno = new AlumnoActualizado();
				alumno.setId(((Alumno)getGrilla().getSelectionModel().getSelectedItems().get(0)).getId());
			}
			alumno.setNombre((String) nombre.getCampoTexto().getValue());
			alumno.setApellido((String) apellido.getCampoTexto().getValue());
			alumno.setTipoDocumento((Dato)tipoDocumento.getCampoDesplegable().getValue());
			alumno.setNumeroDocumento((String)numeroDocumento.getCampoTexto().getValue());
			alumno.setNivel((Dato)nivel.getCampoDesplegable().getValue());
			alumno.setAnio((Dato)anio.getCampoDesplegable().getValue());
			alumno.setDivision((Dato)division.getCampoDesplegable().getValue());
			
			alumno.setPlanesDePagos(planesDePagoDestino.getGrilla().getDatos());
			
			Invocador.invocar(alumno, new RetornoDeLlamadaEnVentanaConGrilla(this));
		}
	}
	
	private ColumnModel getConfiguracionColumnas() {
		ColumnConfig columnNombre = new ColumnConfig(CamposConst.NOMBRE, Mensajes.getInstancia().get("msg.colegio.nombre"), 150);
		ColumnConfig columnApellido = new ColumnConfig(CamposConst.APELLIDO, Mensajes.getInstancia().get("msg.colegio.apellido"), 150);
		ColumnConfig columnTipoDocumento = new ColumnConfig(CamposConst.TIPO_DOCUMENTO, Mensajes.getInstancia().get("msg.colegio.tipodocumento"), 60);
		ColumnConfig columnNumeroDocumento = new ColumnConfig(CamposConst.NUMERO_DOCUMENTO, Mensajes.getInstancia().get("msg.colegio.numerodocumento"), 70);
		ColumnConfig columnNivel = new ColumnConfig(CamposColegioConst.NIVEL, Mensajes.getInstancia().get("msg.colegio.nivel"), 60);
		ColumnConfig columnAnio = new ColumnConfig(CamposColegioConst.ANIO, Mensajes.getInstancia().get("msg.colegio.anio"), 30);
		ColumnConfig columnDivision = new ColumnConfig(CamposColegioConst.DIVISION, Mensajes.getInstancia().get("msg.colegio.division"), 35);
		ColumnConfig columnAnteriorPagoRealizado = new ColumnConfig(Alumno.ANTERIOR_PAGO_REALIZADO, Mensajes.getInstancia().get("msg.colegio.anteriorpagorealizado"), 150);
		ColumnConfig columnUltimoPagoRealizado = new ColumnConfig(Alumno.ULTIMO_PAGO_REALIZADO, Mensajes.getInstancia().get("msg.colegio.ultimopagorealizado"), 150);
		ColumnConfig columnProximaObligacionImpaga = new ColumnConfig(Alumno.PROXIMA_OBLIGACION_IMPAGA, Mensajes.getInstancia().get("msg.colegio.proximaobligacionimpaga"), 150);
		ColumnConfig columnSiguienteObligacionImpaga = new ColumnConfig(Alumno.SIGUIENTE_OBLIGACION_IMPAGA, Mensajes.getInstancia().get("msg.colegio.siguienteobligacionimpaga"), 150);
		ColumnConfig columnTotalAdeudado = new ColumnConfig(Alumno.TOTAL_ADEUDADO, Mensajes.getInstancia().get("msg.colegio.totaladeudado"), 70);
		columnTotalAdeudado.setAlignment(HorizontalAlignment.RIGHT);
		columnTotalAdeudado.setRenderer(new NumberCellRenderer("0.00"));
		
		ArrayList<ColumnConfig> columnConfigs = new ArrayList<ColumnConfig>();
		columnConfigs.add(columnNombre);
		columnConfigs.add(columnApellido);
		columnConfigs.add(columnTipoDocumento);
		columnConfigs.add(columnNumeroDocumento);
		columnConfigs.add(columnNivel);
		columnConfigs.add(columnAnio);
		columnConfigs.add(columnDivision);
		columnConfigs.add(columnAnteriorPagoRealizado);
		columnConfigs.add(columnUltimoPagoRealizado);
		columnConfigs.add(columnProximaObligacionImpaga);
		columnConfigs.add(columnSiguienteObligacionImpaga);
		columnConfigs.add(columnTotalAdeudado);
		
		return new ColumnModel(columnConfigs);
	}
	
	@Override
	public void limpiar() {
		super.limpiar();
		planesDePagoOrigen.getGrilla().limpiar();
		planesDePagoOrigen.getGrilla().load();
		planesDePagoDestino.getGrilla().limpiar();
		planesDePagoDestino.getGrilla().load();
	}

	public Grilla getGrilla() {
		return grilla;
	}

	public CajaDeTexto getNombre() {
		return nombre;
	}


	public CajaDeTexto getApellido() {
		return apellido;
	}


	public ListaDesplegable getTipoDocumento() {
		return tipoDocumento;
	}


	public CajaDeTexto getNumeroDocumento() {
		return numeroDocumento;
	}

	
	public ListaDesplegable getNivel() {
		return nivel;
	}


	public void setNivel(ListaDesplegable nivel) {
		this.nivel = nivel;
	}


	public ListaDesplegable getAnio() {
		return anio;
	}


	public void setAnio(ListaDesplegable anio) {
		this.anio = anio;
	}


	public ListaDesplegable getDivision() {
		return division;
	}


	public void setDivision(ListaDesplegable division) {
		this.division = division;
	}


}
